package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Dept;
import cn.itcast.domain.system.Role;
import cn.itcast.domain.system.User;
import cn.itcast.service.system.DeptService;
import cn.itcast.service.system.RoleService;
import cn.itcast.service.system.UserService;
import cn.itcast.web.controller.BaseController;
import com.github.pagehelper.PageInfo;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用户控制器
 */
@Controller
@RequestMapping("/system/user")
public class UserController extends BaseController{

    @Autowired
    private UserService userService;
    @Autowired
    private DeptService deptService;
    @Autowired
    private RoleService roleService;


    /**
     * 分页查询
     *   1）URL：http://localhost:8080/system/user/list.do
     *   2）参数：pageNum=1&pageSize=5
     *   3)返回： /WEB-INF/pages/system/user/user-list.jsp
     */
    @RequestMapping("/list")
    @RequiresPermissions("用户管理")
    public String list(@RequestParam(defaultValue = "1") Integer pageNum,
                       @RequestParam(defaultValue = "5") Integer pageSize){
       /* Subject subject = SecurityUtils.getSubject();
        subject.checkPermission("用户管理");*/


        //当前登录企业的ID
        String companyId = getLoginCompanyId();

        //1.查询用户数据
        PageInfo pageInfo = userService.findByPage(pageNum,pageSize,companyId);

        //2.存入request域
        request.setAttribute("pageInfo",pageInfo);

        //3.返回页面
        return "system/user/user-list";
    }

    /**
     * 进入添加页面
     *  1）URL：http://localhost:8080/system/user/toAdd.do
     *  2）参数：无
     *  3）返回：/WEB-INF/pages/system/user/user-add.jsp
     */
    @RequestMapping("/toAdd")
    public String toAdd(){
        String companyId = getLoginCompanyId();

        //查询当前企业的所有部门，为了展示下拉列表
        List<Dept> list = deptService.findAll(companyId);
        //存入request
        request.setAttribute("deptList",list);

        return "system/user/user-add";
    }

    /**
     * 保存数据（添加/修改）
     *   1）URL：http://localhost:8080/system/user/edit.do
     *   2）参数：用户表单数据
     *   3）返回：重定向回到列表
     */
    @RequestMapping("/edit")
    public String edit(User user){
        //获取登录企业信息
        String companyId = getLoginCompanyId();
        String companyName = getLoginCompanyName();

        user.setCompanyId(companyId);
        user.setCompanyName(companyName);

        //判断是否有ID
        if(StringUtils.isEmpty(user.getId())){
            //添加
            userService.save(user);
        }else{
            //修改
            userService.update(user);
        }

        return "redirect:/system/user/list.do";
    }

    /**
     * 进入修改页面
     *  1）URL：http://localhost:8080/system/user/toUpdate.do
     *  2)参数：id=1f35c554-3777-419b-b607-f88473068edb
     *  3)返回：/WEB-INF/pages/system/user/user-update.jsp
     */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id){
        String companyId = getLoginCompanyId();

        //1.根据id查询用户
        User user = userService.findById(id);
        //查询当前企业的所有部门，为了展示下拉列表
        List<Dept> list = deptService.findAll(companyId);
        //3.存入request域
        request.setAttribute("user",user);
        request.setAttribute("deptList",list);

        return "system/user/user-update";
    }

    /**
     * 删除用户
     *  1）URL：http://localhost:8080/system/user/delete.do
     *  2）参数：id=1
     *  3）返回：{"flag":true/false,"errorMsg":"xxxxx"}
     */
    @RequestMapping("/delete")
    @ResponseBody //把Java对象转换为Json字符串
    public Map<String,Object> delete(String id){
        Map<String,Object> map = new HashMap<>();

        boolean flag = userService.delete(id);

        if(flag){
            //成功
            map.put("flag",true);
        }else{
            //失败
            map.put("flag",false);
            map.put("errorMsg","用户存在关联数据，无法删除");
        }

        return map;
    }

    /**
     * 进入用户分配角色页面
     *  1）URL： http://localhost:8080/system/user/roleList.do
     *  2)参数：id=002108e2-9a10-4510-9683-8d8fd1d374ef
     *  3）返回：/WEB-INF/pages/system/user/user-role.jsp
     */
    @RequestMapping("/roleList")
    public String roleList(String id){
        //1.查询当前企业的所有角色
        List<Role> roleList = roleService.findAll(getLoginCompanyId());

        //2.查询当前用户分配过的角色
        List<Role> userRoleList = roleService.findUserRoleByUserId(id);

        request.setAttribute("roleList",roleList);
        request.setAttribute("userRoleList",userRoleList);

        //3.查询当前用户
        User user = userService.findById(id);
        request.setAttribute("user",user);

        return "system/user/user-role";
    }

    /**
     * 保存用户和角色的关系
     *  1）URL: http://localhost:8080/system/user//changeRole.do
     *  2)参数：userid=1&roleIds=1&roleIds=2&roleIds=3....
     *  3）返回：重定向到列表
     *
     *     接收多个同名的参数的情况：
     *      1）String： 把所有参数值以逗号分隔拼接成一个字符串
     *      2）String[]: 使用数组分别接收每个参数值
     *      3）List<String>: 不能直接使用集合接收，必须加上@RequestParam注解接收
     */
    @RequestMapping("/changeRole")
    public String changeRole(String userid,@RequestParam("roleIds") List<String> roleIds){

        //调用业务
        userService.changeRole(userid,roleIds);

        return "redirect:/system/user/list.do";
    }
}
